package haw.pr2.A3.implementations;

import haw.pr2.A3.interfaces.Container;
import haw.pr2.A3.interfaces.ContainerTruck;
import haw.pr2.A3.interfaces.Engine;
import haw.pr2.A3.interfaces.Entity;
import haw.pr2.A3.interfaces.Pallet;
import haw.pr2.A3.interfaces.Speed;
import haw.pr2.A3.interfaces.Stowage;


/**
 *
 * @author Fabian Heidorn, Alexander Kaack
 */
public final class Entities implements Entity {
    
    //Factories für Entities
    
/*    //erzeugt einen Lastwagen, der einen Container laden kann
    public static ContainerTruck containerTruck(Engine engine,Speed maxSpeed) {
        return new containerTruckImpl(engine,maxSpeed);
    }

    //erzeugt einen VanCarrier, der einen Container laden kann
    vanCarrierTruck(engine,maxSpeed);

    //erzeugt einen Motor
    shipEngine(boundingBox,maxPower):

            
    //erzeugt einen Schiffsrumpf
    shipHull(boundingBox);

    //erzeugt ein ContainerSchiff mit einem simplen rechteckigen leeren Stauraum für Container, d.h. alles Nullcontainer
    containerShip(hull,engine,maxSpeed,bays,rows,tiers):

    //erzeugt ein Schiff des Schiffstyps XXX, mit einem speziell geformten leeren Stauraum, d.h. es gibt jetzt auch Noncontainer
    XXXTypeShip()
*/
    //erzeugt einen leeren 20ft Container
    public static Container container() {
        return ContainerImpl.entityOf();
    }

    //erzeugt einen NullContainer
    public static Container nullContainer() {
        return NullContainer.singleton();
    }

    //erzeugt einen NonContainer
    public static Container nonContainer() {
        return NonContainer.singleton();
    }

    //erzeugt eine leeres ContainerStowage mit den angegeben Größen, ohne Null- oder NonContainer, diese werden
    public static Stowage containerStowage(int bay, int row, int tier) {
        return ContainerStowageImpl.valueOf(bay, row, tier);
    }

    //erzeugt eine Europalette mit standardisierter Beladung
    public static Pallet pallet() {
        return PalletImpl.entityOf();
    }

    //erzeugt eine Null-Europalette
    public static Pallet nullPallet() {
        return NullPallet.singleton();
    }
    
    //erzeugt eine Non-Europalette
    public static Pallet nonPallet() {
        return NonPallet.singleton();
    }

    //erzeugt ein leeres Stowage Objekt für die Paletten in einem Container (1 bay, 9 rows, 3 tiers)
    public static Stowage palletsStowage() {
        return PalletStowageImpl.valueOf(1, 9, 3);
    }

    
}
